package com.ssy.lingxi.product.service;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.model.vo.PageVO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.platform.template.api.model.dto.inner.OpenMroInnerDTO;
import com.ssy.lingxi.product.api.model.request.CommodityDraftRequest;
import com.ssy.lingxi.product.api.model.request.SimpleIdListRequest;
import com.ssy.lingxi.product.api.model.request.commodity.*;
import com.ssy.lingxi.product.api.model.request.feign.CommodityNameRequest;
import com.ssy.lingxi.product.api.model.request.feign.CommodityPriceRequest;
import com.ssy.lingxi.product.api.model.response.CommodityDraftResponse;
import com.ssy.lingxi.product.api.model.response.CommodityPriceRecordResponse;
import com.ssy.lingxi.product.api.model.response.OftenBuyCommodityResponse;
import com.ssy.lingxi.product.api.model.response.commodity.*;
import com.ssy.lingxi.product.api.model.response.feign.CommodityPriceResponse;
import com.ssy.lingxi.product.api.model.response.feign.CommoditySkuStockResponse;
import com.ssy.lingxi.product.entity.commodity.Commodity;
import com.ssy.lingxi.product.entity.commodity.CommodityAttribute;
import com.ssy.lingxi.product.entity.commodity.CommodityCheckRecord;
import com.ssy.lingxi.product.entity.commodity.CommodityUnitPriceAndPic;
import com.ssy.lingxi.product.entity.commodity.member.CommodityMember;
import com.ssy.lingxi.product.entity.commodity.member.CommodityUnitPriceStrategy;
import org.modelmapper.ModelMapper;
import org.springframework.data.domain.Page;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 商品管理类
 * @author jw.chen
 * @version 2.0.0
 * @date 2020/6/22
 */
public interface ICommodityService {
    /**
     * 查询商品--商品能力
     * @param pageVO
     * @param commodityQueryRequest
     * @return Wrapper<Page<Commodity>>
     */
    Page<Commodity> getCommodityList(PageVO pageVO, CommodityQueryRequest commodityQueryRequest);

    /**
     * 查询商品
     * @param id
     * @return Wrapper<Commodity>
     */
    Commodity getCommodity(Long id);

    /**
     * 添加/修改商品
     * @param sysUser
     * @param commodityRequest
     * @return
     */
    Long saveOrUpdateCommodity(UserLoginCacheDTO sysUser, CommodityAddRequest commodityRequest);

    /**
     * 批量删除商品
     * @param idList
     * @return
     */
    String deleteBatchCommodity(UserLoginCacheDTO sysUser, List<Long> idList);

    /**
     * 提交审核
     * @param id
     * @return
     */
    String applyCheckCommodity(UserLoginCacheDTO sysUser, Long id);

    /**
     * 商品上架/下架--商品能力
     * @param commodityShopRequest
     * @param isPublish 是否上架
     * @return
     */
    String publishCommodity(CommodityShopRequest commodityShopRequest, Boolean isPublish);

    /**
     * 商品上架/下架--商品能力
     * @param commodityShopBatchRequest
     * @param isPublish 是否上架
     * @return
     */
    String publishCommodityBatch(UserLoginCacheDTO sysUser, CommodityShopBatchRequest commodityShopBatchRequest, Boolean isPublish);

    /**
     * 下架某个会员的所有商品--商品能力
     * @param memberId 会员id
     * @param memberRoleId 会员角色id
     * @return
     */
    Boolean offPublishAllCommodity(Long memberId, Long memberRoleId);

    /**
     * 复制商品--商品能力
     * @param simpleIdListRequest 商品Id集合
     * @param commodityType 商品类型
     * @return
     */
    String copyCommodity(UserLoginCacheDTO sysUser, SimpleIdListRequest simpleIdListRequest, Integer commodityType);

    /**
     * 获取规格商品属性
     * @param unitPriceAndPicId 规格商品id
     * @return
     */
    List<CommodityAttribute> getCommodityAttributeByUnitPriceAndPicId(UserLoginCacheDTO sysUser, Long unitPriceAndPicId);

    /**
     * 查询商品列表(快捷修改商品单价)--商品能力
     * @param pageVO 分页实体
     * @param commodityDetailRequest 查询条件实体
     * @return
     */
    PageData<CommodityGoodsResponse> getCommodityPriceList(PageVO pageVO, CommodityDetailRequest commodityDetailRequest);

    /**
     * 查询商品列表(按具体商品查询)--商品能力
     * @param pageVO 分页实体
     * @param commodityDetailRequest 查询条件实体
     * @return
     */
    PageData<CommodityGoodsResponse> getCommodityDetailList(PageVO pageVO, CommodityDetailRequest commodityDetailRequest, Long loginMemberId, Long loginMemberRoleId);

    /**
     * 查询商品列表(按具体商品查询)--库存设置
     * @param pageVO 分页实体
     * @param commodityDetailRequest 查询条件实体
     * @param memberRoleType 会员角色类型
     * @return
     */
    PageData<CommodityStockResponse> getCommodityDetailStockList(PageVO pageVO, CommodityDetailRequest commodityDetailRequest, Integer memberRoleType);

    /**
     * 获取上级供应商的商品库存
     * @param memberId
     * @param shopType
     * @param commoditySkuIdList
     * @return
     */
    HashMap<Long, Double> getUpperCommoditySkuStock(Long memberId, Integer shopType, List<Long> commoditySkuIdList);

    /**
     * 批量获取商品价格
     * @param unitPriceAndPicIdList
     * @return
     */
    Map<Long, Map<String, Double>> getCommodityPriceBatch(Long shopId, List<Long> unitPriceAndPicIdList, Long memberId, Long memberRoleId);

    /**
     * 批量查询商品价格和是否允许使用会员权益
     * @param unitPriceAndPicIdList
     * @return
     */
    Map<Long, CommodityPriceResponse> getCommodityPriceAndMemberPriceBatch(Long shopId, List<Long> unitPriceAndPicIdList, Long memberId, Long memberRoleId);

    /**
     * 获取商品价格
     * @param unitPriceAndPicId
     * @return
     */
    Map<String, Double> getCommodityPrice(UserLoginCacheDTO sysUser, Long unitPriceAndPicId);

    /**
     * 修改商品价格
     * @param unitPriceRequest
     * @return
     */
    String updateCommodityPrice(UserLoginCacheDTO sysUser, UnitPriceRequest unitPriceRequest);

    /**
     * 查询价格策略列表--商品能力
     * @param pageVO
     * @param sysUser
     * @param unitPriceStrategyRequest
     * @return
     */
    Page<CommodityUnitPriceStrategy> getUnitPriceStrategyList(PageVO pageVO, UserLoginCacheDTO sysUser, UnitPriceStrategyRequest unitPriceStrategyRequest);

    /**
     * 新增/修改价格策略--商品能力
     * @param sysUser
     * @param unitPriceStrategyAddRequest
     * @return
     */
    Long saveOrUpdateUnitPriceStrategy(UserLoginCacheDTO sysUser, UnitPriceStrategyAddRequest unitPriceStrategyAddRequest);

    /**
     * 查询价格策略--商品能力
     * @param id 价格策略id
     * @return
     */
    CommodityUnitPriceStrategy getUnitPriceStrategy(Long id);

    /**
     * 通过商品id获取价格策略的所有会员--商品能力
     * @param commodityId 商品id
     * @return
     */
    List<CommodityMember> getStrategyMemberByCommodityId(Long commodityId);

    /**
     * 启用/停用价格策略--商品能力
     * @return
     */
    String updateUnitPriceStrategyStatus(UserLoginCacheDTO sysUser, Long id, Boolean isEnable);

    /**
     * 删除价格策略--商品能力
     * @param id 价格策略id
     * @return
     */
    String deleteUnitPriceStrategy(Long id);

    /**
     * 查询商品--平台后台
     * @param pageVO
     * @param commodityQueryRequest
     * @return
     */
    Page<Commodity> getPlatformCommodityList(PageVO pageVO, CommodityQueryRequest commodityQueryRequest);

    /**
     * 审核--平台后台
     * @param id
     * @return
     */
    String checkCommodity(UserLoginCacheDTO sysUser, Long id, Integer status, String checkRemark);

    /**
     * 查询商品审核记录--平台后台
     * @return Wrapper<?>
     */
    List<CommodityCheckRecord> getCommodityCheckRecord(Long commodityId);

    /**
     * 查询商品审核记录--平台后台
     * @return Wrapper<?>
     */
    Page<CommodityCheckRecord> getCommodityCheckRecordList(PageVO pageVO, Long commodityId, Long startTime, Long endTime);

    /**
     * 查询商品是否用到运费模板
     * @param id 运费模板id
     * @return
     */
    Boolean getCommodityUseTemplate(Long id);

    /**
     * 查询商品是否用到发货地址
     * @param id 发货地址id
     * @return
     */
    Boolean getCommodityUseSendAddress(Long id);

    /**
     * 查询商品是否用到物流公司
     * @param id 物流公司id
     * @return
     */
    Boolean getCommodityUseCompany(Long id);

    /**
     * 查询商品是否用到单位
     * @param id 单位id
     * @return
     */
    Boolean getCommodityUseUnit(Long id);

    /**
     * 查询商品信息
     * @param id 商品skuId
     * @return
     */
    CommodityUnitPriceAndPic getCommodityBySkuId(Long id);

    /**
     * 查询商品sku对应的库存
     * @param memberId
     * @param memberRoleId
     * @param commoditySkuIdList
     * @return
     */
    List<CommoditySkuStockResponse> getCommoditySkuStock(Long memberId, Long memberRoleId, Long shopId, List<Long> commoditySkuIdList);

    /**
     * 查询商品sku列表
     * @param pageVO 分页实体
     * @param commodityDetailRequest 查询条件实体
     * @return
     */
    PageData<CommoditySkuResponse> getCommoditySkuListByShopId(PageVO pageVO, CommodityDetailRequest commodityDetailRequest);

    /**
     * 查询商品列表--平台(全部商品)
     * @param pageVO 分页实体
     * @param commodityDetailRequest 查询条件实体
     * @return
     */
    PageData<CommonCommodityPlatformResponse> getCommodityListByPlatform(PageVO pageVO, CommodityDetailRequest commodityDetailRequest);

    /**
     * 查询商品列表--通过商品sku集合
     * @param commoditySkuIdList 查询条件实体
     * @return
     */
    List<CommodityGoodsResponse> getCommodityByCommoditySkuIdList(List<Long> commoditySkuIdList);

    /**
     * 通过商品id集合查询商品
     * @param commodityIdList
     * @return
     */
    List<Commodity> getCommodityByIdList(List<Long> commodityIdList);

    /**
     * 查询上游供应会员商品列表--通过会员商品sku集合
     * @param commoditySkuIdList 查询条件实体
     * @return
     */
    List<UpperCommodityResponse> getUpperCommodityByCommoditySkuIdList(List<Long> commoditySkuIdList);

    /**
     * 判断商品是否上架
     * @return
     */
    String getCommodityIsPublish(Long shopId, List<CommodityNameRequest> commodityNameList);

    /**
     * 判断商品是否上架
     * @return
     */
    List<Long> getCommodityListByIsPublish(Long shopId, List<CommodityNameRequest> commodityNameList);

    /**
     * 查询商品历史价格
     * @param commoditySkuId  商品SkuId
     * @param days         最近多少天
     * @return 商品历史价格
     */
    CommodityPriceRecordResponse getPriceRecord(Long commoditySkuId, Integer days);

    /**
     * 查询常购清单列表
     * @param pageVO        分页实体
     * @param shopId        商城id
     * @param sysUser       当前登录用户
     * @return 常购清单列表
     */
    PageData<OftenBuyCommodityResponse> getOftenBuyCommodityList(PageVO pageVO, Long shopId, String name, UserLoginCacheDTO sysUser);

    /**
     * 查询商品信息列表--订单校验商品信息
     * @param commodityPriceRequest 查询条件实体
     * @return
     */
    List<CommodityOrderResponse> getCommodityListByOrder(CommodityPriceRequest commodityPriceRequest);

    /**
     * 查询商品并通过商城id分组
     * @param commodityIdList 商品id数组
     * @return key:商城id; value:商品id数组
     */
    Map<Long, List<Commodity>> getCommodityListGroupByShopId(List<Long> commodityIdList);

    /**
     * 通过商品skuId数组查询对应的商品一级品类id
     * @param commoditySkuIdList 商品skuId数组
     */
    List<CommoditySkuIdAndFirstCategoryIdResponse> getCommodityFirstCategoryIdList(List<Long> commoditySkuIdList);

    /**
     * 通过商品id查询对应的商品skuId数组
     * @param idList 商品id数组
     */
    List<CommodityIdAndSkuIdListResponse> getCommoditySkuIdList(List<Long> idList);

    /**
     * 查询商品是否配置了库存
     * @param commodityIdList 商品id数组
     */
    List<Long> getCommodityIsExistStock(List<Long> commodityIdList);

    /**
     * 查询商品草稿列表
     * @param pageVO 分页实体
     */
    PageData<CommodityDraftResponse> getCommodityDraftList(UserLoginCacheDTO sysUser, PageVO pageVO);

    /**
     * 查询商品草稿
     * @param commodityDraftId 商品草稿id
     */
    CommodityDraftResponse getCommodityDraftById(Long commodityDraftId);

    /**
     * 保存商品草稿
     */
    Long saveOrUpdateCommodityDraft(UserLoginCacheDTO sysUser, CommodityDraftRequest commodityDraftRequest);

    /**
     * 删除商品草稿
     */
    Boolean deleteCommodityDraft(UserLoginCacheDTO sysUser, List<Long> commodityDraftIdList);

    /**
     * 导出商品导入模板
     * @return 导入模板
     */
    void exportCommodityTemplate(UserLoginCacheDTO sysUser, HttpServletRequest request, HttpServletResponse response);

    /**
     * 导入商品
     * @param file  商品文件
     * @return 导入情况说明
     */
    Boolean importCommodity(UserLoginCacheDTO sysUser, MultipartFile file);

    /**
     * 校验是否开启MRO模式
     * @param openMroInnerDTO
     * @return
     */
    Boolean checkIsOpenMro(OpenMroInnerDTO openMroInnerDTO);

    /**
     * 导出商品sku纬度数据
     */
    void exportCommoditySkuByCommodityIdList(HttpServletResponse response, List<Long> commodityIdList);

    /**
     * 根据平台品类id查询商品
     *
     * @param categoryIdList
     * @return
     */
    List<Commodity> findAllByCategoryIdIn(List<Long> categoryIdList);

    /**
     * 根据平台品类id查询商品
     *
     * @param categoryIdList
     * @param attributeIdList
     * @return
     */
    List<Commodity> findAllByCategoryIdInAndAttributeIdIn(List<Long> categoryIdList,List<Long> attributeIdList);
    /**
     * S2B功能--商品列表 查看上游商品
     * 下游销售会员(B端)查看上游供应会员(S端)商品列表
     * @param user 登录会员信息
     * @param pageVO 分页参数
     * @param commodityUpperQueryRequest 查询参数(选择上游供应商品选传)
     * @param modelMapper 对象转换类
     * @return 商品分页列表
     */
    Wrapper<PageData<S2BCommodityResponse>> getUpperCommodityListS2B(UserLoginCacheDTO user, PageVO pageVO, CommodityUpperQueryRequest commodityUpperQueryRequest, ModelMapper modelMapper);

    /**
     * S2B功能--商品列表 查看下游商品
     * 上游供应会员(S端)查看下游销售会员(B端)商品列表
     * @param user 登录会员信息
     * @param pageVO 分页参数
     * @param commodityUpperQueryRequest 查询参数(选择下游销售商品)
     * @param modelMapper 对象转换类
     * @return 商品分页列表
     */
    Wrapper<PageData<SubCommodityResponse>> getSubiteCommodityListS2B(UserLoginCacheDTO user, PageVO pageVO, CommodityUpperQueryRequest commodityUpperQueryRequest, ModelMapper modelMapper);

    /**
     * 判断货品是否于商品关联
     *
     * @param request 货品(物料)ids
     * @return Boolean
     */
    Boolean goodsUsing(SimpleIdListRequest request);

    /**
     * 查询商品导入批次
     * @param importBath 商品导入批次
     */
    List<String> getCommodityImportBath(UserLoginCacheDTO sysUser, String importBath);

    /**
     * 通过商品导入批次删除商品
     * @param importBath 商品导入批次
     */
    Boolean deleteCommodityByImportBath(UserLoginCacheDTO sysUser, String importBath);
}
